ホームに戻る
出典 :
Model-View-ViewModel - .NET | Microsoft Learn INotifyPropertyChanged インターフェイス (System.ComponentModel) | Microsoft Learn ICommand インターフェイス (System.Windows.Input) | Microsoft Learn MVVMパターンの常識 ― 「M」「V」「VM」の役割とは? - @IT WPF超絶入門から学び直し1【MVVM】 #C# - Qiita MVVMパターンを使用したWPFにおける View - ViewModel の連携について #C# - Qiita 【C#-WPF】MVVMパターンにおけるViewとViewModel間のインスタンス生成方法について - 業務のためのC#・C言語・C++学習
関連 :
DataContext INotifyPropertyChanged コマンド(ICommand) MVVM Toolkit データバインディング ReactiveProperty 依存関係プロパティ デリゲートとイベント
目次 :

MVVMパターンとは

WPFで推奨されているデザインパターンで、Model - View - ViewModel の略。 外観( View )と、外観に関連づくデータモデル( ViewModel )を分離することで、堅牢で透過性の高いアプリケーションとすることを目論んでいる。

MVCとの関連

MVVMは、Webアプリで主に用いられるMVC( Model - View - Controler )から派生したパターンで、類似点も多い。 View が外観を、Model が外観に直接関連しないデータを取り扱うという点は共通である。

MVVMの構成

画像 View はXAMLとコードビハインド(XAML.CS)から成り、外観を司る。 ViewModel は View とは独立しており、ViewModel のインスタンスが View の DataContext として関連づけられる。 これにより ViewModel のプロパティ(CLIプロパティ)と View の依存関係プロパティとが関連づけられ、 ViewModel の変更が View に伝播する。 この View と関連づけられた ViewModel のプロパティを「変更通知プロパティ」と呼び、 View と ViewModel とのプロパティの関連づけを「データバインディング」と呼ぶ。 逆に View に対するユーザの操作(イベント)は ViewModel の「コマンド」に関連づけられ、ユーザ操作が ViewModel に伝播する。 (コマンドバインディング) Model ( ViewModel ではない)は外観によらないデータおよび業務ロジックを指し、ViewModel に組み込まれることで外観に関連づけられる。

ファイル構成例

画像 ウィンドウまたはユーザーコントロールごとに View を作成する。通常、ViewModel は View と一対だが、複数の View で共有することも可能。 View と連動させる ViewModel のプロパティは組み込み型を直接保持するか、必要な Model をインスタンス化する。 コマンドも同様に、それぞれの View で用いるもののインスタンスを ViewModel で保持する。

注意が必要な点

Visual Studioでウィンドウやユーザーコントロールを作成した際、対応するXAMLとコードビハインドは対で作成されるが、 ViewModel はいかなる場合も自動では作成されない(MVVMに準拠した構成とならない)。 このため、コードビハインドが ViewModel だと誤解されることも多いが誤りである。ViewModel はあくまで手動で作成する必要がある。 変更通知プロパティやコマンドを含めた ViewModel の実装を自力で行うと記述が非常に煩雑となるが、 MVVM Toolkit等のライブラリを活用することでコードの記述を大幅に削減できる。 なお、MVVMパターンはコードビハインドの記述を最小限に留めることが推奨されている。 DataContext やバインディングの指定はXAMLで行うことが可能で、ユーザアクションへの対応(イベント処理)もコマンドに委譲できる。 この場合、コードビハインドにはコンストラクタしか記述されない。

ViewModel の実装

DataContextを参照。